﻿#define _CRT_SECURE_NO_WARNINGS

#include<iostream>
#include<array>
#include"Date.h"

using namespace std;


//template<class T,size_t N>
//class Stack
//{
//public:
//	//............
//private:
//	T a[N];
//};
//
//int main()
//{
//	Stack<int, 0>;
//	Stack<int, 5>;
//	Stack<int, 10>;
//	return 0;
//}
//template<class T, size_t N=10>
//class Stack
//{
//public:
//	//............
//private:
//	T x;
//};
//
//int main()
//{
//		array<int, 10> a1;
//		cout << a1[11] << endl;//想越界操作，门都没有
//
//	int a[10];
//	cout<<a[12]<<endl ;//这里进行了越界读的操作！
//
//	return 0;
//}

// 函数模板 -- 参数匹配
/*template<class T>
bool Less(T left, T right)
{
	return left < right;
}*/
//template<class T>
//bool Less(const T& left, const T& right)
//{
//	return left < right;
//}
////特化
//template<>
//bool Less<Date*>( Date* const&  left,  Date* const&  right)
//{
//	return *left < *right;
//}
//
//int main()
//{
//	cout << Less(1, 2) << endl; //可以比较，结果正确
//
//	Date d1(2022, 7, 7);
//	Date d2(2022, 7, 8);
//	cout << Less(d1, d2) << endl;//可以比较，结果正确
//
//	Date* p1 = &d1;
//	Date* p2 = &d2;
//	cout << Less(p1, p2) << endl; //可以比较，结果错误
//	return 0;
//}

//类模版
template<class T1, class T2>
class Data
{
public:
	Data() { cout << "Data<T1, T2>" << endl; }
private:
	T1 _d1;
	T2 _d2;
};

//全特化
template<>
class Data<int, char>
{
public:
	Data() { cout << "Data<int, char>" << endl; }
private:
	int _d1;
	char _d2;
};

//偏特化
template<class T1>
class Data<T1, double>
{
public:
	Data() { cout << "Data<T1, double>" << endl; }
private:
	int _d1;
	char _d2;
};

//两个参数偏特化为指针类型 
template <typename T1, typename T2>
class Data <T1*, T2*>
{
public:
	Data() { cout << "Data<T1*, T2*>" << endl; }

private:
	T1 _d1;
	T2 _d2;
};
//两个参数偏特化为引用类型
template <typename T1, typename T2>
class Data <T1&, T2&>
{
public:
	Data(const T1& d1, const T2& d2)
		: _d1(d1)
		, _d2(d2)
	{
		cout << "Data<T1&, T2&>" << endl;
	}

private:
	const T1& _d1;
	const T2& _d2;
};
void test2()
{
	Data<int*, int*> d3; 
	Data<int&, int&> d4(1, 2); 
}

int main()
{
	test2();
	//Data<int, int> d1;//走类模版
	//Data<int, char> d2;//走全特化
	//Data<int, double> d3;//走偏特化
	return 0;
}
